package leetcode.链表;

/**
 * 移除链表元素
 *
 * 删除链表中等于给定值 val 的所有节点。
 *
 * 示例:
 *
 * 输入: 1->2->6->3->4->5->6, val = 6
 * 输出: 1->2->3->4->5
 */
public class Test203移除链表元素 {

    static class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }
    }

    /**
     * 此题解题的关键是，如何返回修改完毕之后的链表头结点
     * @param head
     * @param val
     * @return
     */
    public static ListNode removeElements(ListNode head, int val) {
        if (head == null) {
            return head;
        }
        /**
         * 这一步，不仅仅是保留链表的头结点的指针
         * 更是为了处理头结点为 val 的特殊情况
         */
        ListNode cur = new ListNode(0);
        cur.next = head;
        ListNode ans = cur;
        // 遇到 val 后指针往后挪
        while (cur != null && cur.next != null) {
            if (cur.next.val == val) {
                ListNode delNode = cur.next;
                cur.next = delNode.next;
                delNode = null;
            } else {
                cur = cur.next;
            }
        }
        return ans.next;
    }

    public static void main(String[] args) {
        ListNode l1 = new ListNode(6);
        ListNode l2 = new ListNode(6);
        ListNode l3 = new ListNode(6);
        ListNode l4 = new ListNode(3);
        ListNode l5 = new ListNode(4);
        ListNode l6 = new ListNode(5);
        ListNode l7 = new ListNode(6);
        l1.next = l2;
        l2.next = l3;
        l3.next = l4;
        l4.next = l5;
        l5.next = l6;
        l6.next = l7;

        int val = 6;
        ListNode ans = removeElements(l1, val);
        while (ans != null) {
            System.out.print(ans.val);
            ans = ans.next;
        }
    }
}
